#include <stdio.h>
#include <sys/ipc.h>
#include <sys/types.h>
#include <sys/shm.h>
#include <errno.h>
#include <unistd.h>
#include <sys/stat.h>
#include <stdlib.h>
#include "address_book_system.h"
//这是前台进程，用于获取用户的操作并反馈给后台进程

//创建共享内存函数,需要p的地址
int CreateFtok(struct msg** p)
{
    key_t key=ftok("./app",'a');
    if (-1==key)
    {
        perror("ftok err\n");
        return -1;
    }

    int shmid = shmget(key,128,IPC_CREAT|IPC_EXCL|0666);
    if (-1==shmid)
    {
        if (EEXIST == errno)
        {
            shmid=shmget(key,128,0666);
        }
        else
        {
            perror("shmget err\n");
            return -1;
        }
        
    }
    
    *p=(struct msg*)shmat(shmid,NULL,0);
    if(*p==(struct msg*)-1)
    {
        perror("shmat err\n");
        return -1;
    }

    return shmid;
}

//用户开始界面，跟据用户的选择发送不一样的信息给后台
void User_Start_Menu(struct msg* p)
{
    printf("********您已进入通讯录系统!********\n");
    printf("登入帐号请输入1\n");
    printf("注册帐号请输入2\n");
    printf("退出请输入3\n");
    printf("***********************************\n");
    scanf("%d",&p->flag);
}

//用户主界面
void User_Main_Menu(struct msg* p)
{
    printf("***********************************\n");
    printf("请输入序号来进行下面的操作\n");
    printf("1.添加联系人\n");
    printf("2.显示联系人\n");
    printf("3.删除联系人\n");
    printf("4.查找联系人\n");
    printf("5.修改联系人\n");
    printf("6.清空联系人\n");
    printf("7.设置\n");
    printf("8.退出登录\n");
    printf("9.注销账户\n");
    printf("***********************************\n");
    scanf("%d",&p->userflag);
}

int main(int argc,char const* argv[])
{
    struct msg* p;
    int usernum=0;
    
    int shmid=CreateFtok(&p); 
    while (1)
    {
        p->flag=0;
        p->userflag=0;
        while(1)//初始界面
        {
            User_Start_Menu(p);
            if (p->flag==LOGIN)//登入
            {
                p->flag=User_Login(&usernum,&p->userdata);
                if (p->flag==LOGINSUCCESS)
                {
                    break;
                }
            }
            else if (p->flag==REGISTER)//注册
            {
                User_Registration_Features();
            }
            else if (p->flag==LOGOUT)//退出
            {
                printf("雪球通讯录欢迎您的下次使用!再见!\n");
                shmctl(shmid,IPC_RMID,NULL);
                return 0;
            }
            else
            {
                continue;
            }
        }
        while (p->flag==LOGINSUCCESS)//主界面
        {
            User_Main_Menu(p);
            if (p->userflag==ADDCONTACT)//添加
            {
                Add_Contact(usernum);
            }
            else if (p->userflag==SHOWCONTACT)//显示
            {
                Show_Contact(usernum);
            }
            else if (p->userflag==DELETECONTACT)//删除
            {
                Delete_Contact(usernum);
            }
            else if (p->userflag==FINDCONTACT)//查找
            {
                Find_Contact(usernum);
            }
            else if (p->userflag==CHANGECONTACT)//修改
            {
                Change_Contact(usernum);
            }
            else if (p->userflag==CLEARCONTACT)//清空
            {
                Clear_Contact(usernum);
            }
            else if (p->userflag==SETUP)//设置
            {
                Setup();
            }
            else if (p->userflag==SIGNOUT)//用户退出
            {
                User_Log_Out();
                break;
            }
            else if(p->userflag==DEREGISTER)//注销
            {
                User_Deregistration_Features(usernum);
                break;
            }
            else
            {
                continue;
            }
        }
    }
    
    shmctl(shmid,IPC_RMID,NULL);

    return 0;
}